package client_server_jpg;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;
import java.io.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 主服务器类，用于启动图片上传服务。
 */
public class Server {
    /**
     * 主函数入口。
     * @param args 命令行参数（未使用）
     * @throws IOException 如果发生I/O错误。
     */
    public static void main(String[] args) throws IOException {
        // 配置服务器端口
        int port = 8899;
        System.out.println("图片服务器已开启....");

        // 无限循环，等待客户端连接
        while (true) {
            // 创建ServerSocket并监听端口
            ServerSocket ss = new ServerSocket(port);
            Socket socket = ss.accept();

            // 启动一个新的线程处理上传
            new Thread(new UploadThread(socket)).start();
        }
    }
}

/**
 * 处理文件上传的线程类。
 */
class UploadThread implements Runnable {
    private Socket socket; // 客户端socket连接
    private static final String UPLOAD_DIR = "demo22\\resources\\"; // 上传文件的目标目录
    private static final AtomicInteger FILE_COUNTER = new AtomicInteger(0); // 用于生成唯一文件名的计数器

    /**
     * 构造函数。
     * @param socket 客户端的Socket连接。
     */
    public UploadThread(Socket socket) {
        this.socket = socket;
    }

    /**
     * 线程的run方法，处理文件的接收和保存。
     */
    @Override
    public void run() {
        try {
            // 自动资源管理，尝试打开输入输出流
            try (InputStream in = socket.getInputStream();
                 OutputStream out = socket.getOutputStream()) {

                // 生成新的文件名并保存文件
                String newFilename = UUID.randomUUID().toString().replace("-", "") + "_" + FILE_COUNTER.incrementAndGet() + ".jpg";
                File file = new File(UPLOAD_DIR + newFilename);
                byte[] buf = new byte[1024];
                int len;
                try (FileOutputStream fos = new FileOutputStream(file)) {
                    while ((len = in.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                    }
                }

                // 向客户端发送上传成功的消息
                String response = "success!!!upload\\" + newFilename + ".jpg";
                out.write(response.getBytes());
            }
        } catch (IOException e) {
            // 异常处理，打印堆栈跟踪
            e.printStackTrace();
            // 在此处可考虑向客户端发送错误代码或消息
        } finally {
            // 尝试优雅地关闭socket和相关流
            try {
                if (socket != null && !socket.isClosed()) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
